package utils

type Stack struct {
	elements []interface{}
}

// 创建新栈
func NewStack() *Stack {
	return &Stack{elements: make([]interface{}, 0)}
}

// 入栈
func (s *Stack) Push(value interface{}) {
	s.elements = append(s.elements, value)
}

// 出栈
func (s *Stack) Pop() (interface{}, bool) {
	if len(s.elements) == 0 {
		return nil, false
	}

	lastIndex := len(s.elements) - 1
	value := s.elements[lastIndex]
	s.elements = s.elements[:lastIndex]
	return value, true
}

// 查看栈顶元素
func (s *Stack) Peek() (interface{}, bool) {
	if len(s.elements) == 0 {
		return nil, false
	}
	return s.elements[len(s.elements)-1], true
}

// 获取栈大小
func (s *Stack) Size() int {
	return len(s.elements)
}

// 判断栈是否为空
func (s *Stack) IsEmpty() bool {
	return len(s.elements) == 0
}
